package rkdwogus7.basic;

import java.util.Scanner;

public class J08_Array {

	public static void main(String[] args) {
		// 배열 Array
		// 동일한 종류의 여러 개의 값들을 저장할 수 있는 자료구조
		// 배열에 저장되는 내용을 요소element라 하고
		// 각 요소는 위치값index을 이용해서 접근할 수 있음
		// 위치값은 0부터 시작함
		
		// 배열 변수 선언
		// int number;		/*단일값 저장*/
		int numbers[];		// 정수형 배열, 배열값을 정할때는 가급적 복수로 지정해줘
		double taxes[];		// 실수형 배열
		char names[];		// 문자 배열
		
		// 배열 생성
		numbers = new int[10];		// 10개의 정수 저장
		taxes = new double[10];		// 10개의 실수 저장
		names = new char[10];		// 10개의 문자 저장
		/*규칙
		 정수 10개 생성할 거니까 int형으로 맞춰줘야지.
		 다른 자료형을 하나의 배열에 넣을 수 없는거야.*/
		
		System.out.println( numbers );
		System.out.println( taxes );
		System.out.println( names );
		
		// [I@1d2fc36 I는 int 말하는거고. @이하에는 저아이가 들어있는 주소가 나와.
		// [D@ac6a45 D는 double말하는거고, @이하에는 당연히 주소가 나오겠지
		// C는 안나오는데 이건 나중에 설명
		
		System.out.println( numbers[0] );
		System.out.println( numbers[1] );
		System.out.println( numbers[9] );
		
		System.out.println( taxes[0] );
		System.out.println( taxes[1] );
		System.out.println( taxes[9] );
		
		System.out.println( names[0] );
		System.out.println( names[1] );
		System.out.println( names[9] );
		
		// 참조자료형 같은 경우에는 기본적으로 값이 초기화되지.
		// 문자는 여전히 안나오기는 하지
		
		names[0] = '수';
		names[1] = '지';
		names[2] = '!';
		System.out.println( names );
		System.out.println( names[0] );
		System.out.println( names[1] );
		System.out.println( names[2] );
		System.out.println( "" + names );
		
		/* 알트키 누르고 방향키 누르면 움직인다... 이런...
		  게다가 블록 안잡고 컨트롤 알트 방향키 해도 복사가 돼....*/
		// 포인터로 가리키고 있기 때문에 스트링인 경우에는 빈 곳으로 가는거래.
		// 일단 이해가 잘 안되면 듣고 넘어가자. 왜그런지 궁금하면 찾아봐
		
		// numbers에 1 ~ 10 까지 값 저장
		numbers[0] = 1;
		numbers[1] = 2;
		numbers[2] = 3;
		numbers[3] = 4;
		numbers[4] = 5;
		numbers[5] = 6;
		numbers[6] = 7;
		numbers[7] = 8;
		numbers[8] = 9;
		numbers[9] = 10;
		
		System.out.println( numbers[0] );
		System.out.println( numbers[2] );
		System.out.println( numbers[4] );
		System.out.println( numbers[6] );
		System.out.println( numbers[8] );
		
		// 반복문을 이용한 배열 처리
		for(int i = 0; i < 10; ++i) {
			numbers[i] = i + 1;
		}
		for(int i = 1; i <= 10; ++i) {
			numbers[i - 1] = i;
		}
		
		// 키보드로 입력받은 정수 5개를 그대로 출력
		Scanner sc = new Scanner(System.in);
		System.out.println("정수 5개를 입력하세요");
/*		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		int num3 = sc.nextInt();
		int num4 = sc.nextInt();
		int num5 = sc.nextInt();	// 대량의 데이터를 사용할 때는 배열이 필요한 이유
*/
		// 각 코드에 공통 요소가 없기 때문에 반복문으로 변경 불가!
		int nums[] = new int[5];
/*		nums[0] = sc.next();
		nums[1] = sc.next();
		nums[2] = sc.next();
		nums[3] = sc.next();
		nums[4] = sc.next();*/
		// 각 코드에 공통요소가 있으므로 반복문으로 변경 가능!
		for(int i = 0; i <= 4; ++i) {
			nums[i] = sc.nextInt();		/*숫자 쓰고 한칸 띄우고 다시 입력해도 됨*/
			System.out.print( nums[i] + " " );
		}
		// 배열에 저장된 값을 출력하기
/*		System.out.println( nums[0] );
		System.out.println( nums[1] );
		System.out.println( nums[2] );
		System.out.println( nums[3] );
		System.out.println( nums[4] );*/
		// 각 코드에 공통요소가 있으므로 반복문으로 변경 가능!
		for(int i = 0; i <= 4; ++i) {
			System.out.print( nums[i] );
		}
		// 배열의 각 요소를 단순히 순차적으로 처리할 목적이면 for-each로 처리하는 것이 좋음
		for( int i : nums ) {
			System.out.print( i );
		}
		
		// 배열의 크기 알아내기 :배열이름.length 속성 이용
		System.out.println( nums.length );
		System.out.println( numbers.length );
		
		
		// 배열 사용 시 볼 수 있는 오류
		double vals[] = new double[100];
		vals[0] = 100.0;
		// vals[100] = 100.0;
		// ArrayIndexOutOfBoundsException 오류발생
		// 발생이유 : 넣을 수 없는 곳에 넣었기 때문에 오류 발생
		// practice에서 연습하다가 발생한 오류 기억해
		vals[0] = sc.nextDouble();		/* 입력 중에 숫자가 아닌 문제가 발생*/
		// InputMismatchException 오류 발생
		// 여려 개의 문제가 발생하는 건 다른 사람이 짜 놓은 코드에서도 문제가 있기 때문
		// 이건 내일 배우기로~
		
		
		
		
		
	}

	
	

	
}








